/* 
 * File:   FileMng.h
 * Author: frank
 *
 * Created on 2013年10月26日, 上午10:46
 */

#include<iostream>
#include<string>
#include <stdlib.h>
#include<ctime>
using namespace std;

////////////////////////////////////////////////////////////
//
//						   宏定义
//
///////////////////////////////////////////////////////////


#define VOL_HD  512
#define SECT_BASE  000
#define SECT_HEADINDEX 254
#define SECT_USERDIR 255
#define SECT_VACDIR  256
#define SECT_ROOTDIR 257
#define SECT_PSDFILE 258
#define SECT_ONLINE 259

#define TYPE_FILE 1
#define TYPE_DIR 2
#define TYPE_NONE 0


//目标的类型：0为BaseDir 1为直接文件 2为索引块号 
//3为目录文件 4为空闲块表 5为密码文件 -1为未定义

#define FILE_MAX 32     //目录内包含文件的最大个数
#define INDEX_MAX 32  
#define OPEN_MAX 32
#define STRMEMO_MAX 64   //内存中储存流的最大个数
#define USER_MAX 32  
#define CONTENT_MAX 2048   //一个文件的内容最大字符数
#define SECT_MAX 4 //一个文件最多可包含的块数

//权限：
//   loadType%PMS==0 则执行
//   loadType%PMS!=0 则无权访问
//

#define NONE 5
#define READ 3
#define WRITE 2
#define RANDW 1

#define FAIL -1
#define SUCCESS 1
#define ACCESS 9999

/////////////////////////////////////////////////////////////////
//
//						内存的数据结构
//	
////////////////////////////////////////////////////////////////



//内存中的打开文件表
struct MemoOpenFile
{
	 char name[50];
	 short sectMemo[SECT_MAX][2];  //外存的块号以及内存号
	 short access; //访问位
	 short mod;    //修改位  0为未修改 1为脏数据
	 short loadType; //打开方式
	 short size;   //文件的总块数
	 short type;   //文件类型
};




////////////////////////////////////////////////////////////////
//
//							硬盘的数据结构
//
////////////////////////////////////////////////////////////////


//基本块
struct BaseSect
{
	short vacantSect;
	short userSect;
	short HeadIndexSect;

};


//空闲块表
struct VacantTable
{
	short sectNum;
	short start[VOL_HD];
	short len[VOL_HD];
};



//文件头的索引
struct HeadIndex
{
	char name[50];  //文件名
	short PMS;   //权限
	short sects[SECT_MAX];
	short type;  //文件类型
	short size;  //文件总块数
	long  modTime;   //上次修改时间
	short rdCnt; //读此文件的用户数
	short wrtCnt; //写此文件的用户数
	
};



//用户名及密码文件
struct User
{
	char name[20];
	char psd[10];
};


////////////////////////////////////////////////////////////////
//
//						       函数声明
//
////////////////////////////////////////////////////////////////


////////////////////////////////
//
//        FilePart.cpp
//
/////////////////////////////////
extern BaseSect baseMemo;
extern MemoOpenFile openFileMemo[OPEN_MAX];
extern int openedSize;
extern int openedSum;
extern char strMemo[STRMEMO_MAX][CONTENT_MAX];

void HDformat();
void iniMemo();
int addUser(char*newName,long modTime);
void loadHeadIndex(HeadIndex *headIndex);
void unloadHeadIndex(HeadIndex *headIndex);
int loadToMemo(short sect);
void unloadMemo(short memoNum);
void iniSect(int sect);
void writeBack(char *stream,short sect);
void buildDir(char *strDir,char *filename,char* spms,char ctype,long modTime);
int delUser(char *name);


/////////////////////////////
//
//     Functions.cpp
//
/////////////////////////////

int getVacSect(int vNum);
int getHeadNode(HeadIndex *headIndex,char *filename);
void delSect(int vNum,short sect);
int isOwner(char *name,char *filename);
void replaceContent(char *stream,int openNum,char*name);
void appendContent(char *stream,int openNum,char*name);
void addHead(HeadIndex *headIndex,char *filename,short pms,short sect,short type,short size,long modTime);
void delFileInDir(int dirOpenNum,char *file,char *name);
void showOpen();

//////////////////////////
//
//			Login.cpp
//
////////////////////////////

void login(char *name);
int addOnline(char *name);
int delOnline(char *name);
int onlyRoot();
int addUserHead(char *newName,long modTime);
int delUserHead(char *name);



//////////////////////////
//
//			BasicCmd.cpp
//
////////////////////////////


int loadFile(char *filename,short loadType,char *name);
int unloadFile(char *filename,char*name);
int deleteFile(char *filename,char*name);
int showFile(char *filename);
int editFile(char *filename,char*name);
int createFile(char *path,char *filename,char *name);



